package com.shundr.common.dao;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.Callable;

import android.content.Context;

import com.j256.ormlite.dao.Dao;
import com.j256.ormlite.stmt.QueryBuilder;
import com.j256.ormlite.table.TableUtils;
import com.shundr.common.model.AreaInfo;
import com.shundr.common.util.AreaUtils;
import com.shundr.frame.db.LDaoManager;
import com.shundr.frame.util.LLogger;
import com.shundr.frame.util.StringUtil;
/**
 * 
 * AreaDao
 * 
 * @author larry 2015-4-14 下午6:55:45 
 * @version 1.0.0
 *
 */
public class AreaDao {
	
	private Dao<AreaInfo, Integer> areaDao;
	
	public AreaDao() {
		areaDao = LDaoManager.createDao(AreaInfo.class);
	}
	
	/**
	 * 根据parentCode 获取父级
	 * getAreaByParentCode(这里用一句话描述这个方法的作用)
	 * (这里描述这个方法适用条件 – 可选)
	 * @param parentCode
	 * @return
	 * AreaInfo
	 * @exception
	 * @since  1.0.0
	 */
	public AreaInfo getAreaByParentCode(String parentCode){
		try {
			if(StringUtil.isEqual(parentCode, "00")){
				return areaDao.queryForEq("code", "null").get(0);
			}
			List<AreaInfo> list = areaDao.queryForEq("code", parentCode);
			if(list.size() > 0){
				return list.get(0);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	/**
	 * 根据code获取自身
	 * getAreaByCode(这里用一句话描述这个方法的作用)
	 * (这里描述这个方法适用条件 – 可选)
	 * @param code
	 * @return
	 * AreaInfo
	 * @exception
	 * @since  1.0.0
	 */
	public AreaInfo getAreaByCode(String code){
		try {
			if(StringUtil.isNull(code)){
				return areaDao.queryForEq("code", "null").get(0);
			}
			List<AreaInfo> list = areaDao.queryForEq("code", code);
			if(list.size() > 0){
				return list.get(0);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 根据code获取父级
	 * getParentAreaByCode(这里用一句话描述这个方法的作用)
	 * (这里描述这个方法适用条件 – 可选)
	 * @param code
	 * @return
	 * AreaInfo
	 * @exception
	 * @since  1.0.0
	 */
	public AreaInfo getParentAreaByCode(String code){
		try {
			if(StringUtil.isNull(code)){
				return areaDao.queryForEq("code", "null").get(0);
			}
			List<AreaInfo> list = areaDao.queryForEq("code", code);
			AreaInfo self = null;
			if(list.size() > 0){
				self = list.get(0);
			}
			if(self == null)
				return null;
			List<AreaInfo> pList = areaDao.queryForEq("code", self.getParentCode());
			if(pList.size() > 0){
				return pList.get(0);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return null;
	}
	
	/**
	 * 根据父Code获取子列表
	 * getAreasByParent(这里用一句话描述这个方法的作用)
	 * (这里描述这个方法适用条件 – 可选)
	 * @param parentCode
	 * @return
	 * List<AreaInfo>
	 * @exception
	 * @since  1.0.0
	 */
	public List<AreaInfo> getAreasByParent(String parentCode){
		try {
			QueryBuilder<AreaInfo, Integer> queryBuilder = areaDao.queryBuilder();
			queryBuilder.where().eq("parentCode", parentCode);
			queryBuilder.orderBy("sort", false);
			return queryBuilder.query();
		} catch (SQLException e) {
			LLogger.e("创建数据类型时异常" + e);
		}
		return new ArrayList<AreaInfo>();
	}
	
	/**
	 * 根据父Code获取子列表
	 * getAreasByParent(这里用一句话描述这个方法的作用)
	 * (这里描述这个方法适用条件 – 可选)
	 * @param parentCode
	 * @return
	 * List<AreaInfo>
	 * @exception
	 * @since  1.0.0
	 */
	public List<AreaInfo> getAreasByParentWithoutAll(String parentCode){
		try {
			QueryBuilder<AreaInfo, Integer> queryBuilder = areaDao.queryBuilder();
			queryBuilder.where().eq("parentCode", parentCode).and().ne("code", parentCode)
			.and().ne("code", "null");
			queryBuilder.orderBy("sort", false);
			return queryBuilder.query();
		} catch (SQLException e) {
			LLogger.e("创建数据类型时异常" + e);
		}
		return new ArrayList<AreaInfo>();
	}
	
	/**
	 * 获取所有的区域
	 * getAllAreas(这里用一句话描述这个方法的作用)
	 * (这里描述这个方法适用条件 – 可选)
	 * @return
	 * List<AreaInfo>
	 * @exception
	 * @since  1.0.0
	 */
	public List<AreaInfo> getAllAreas(){
		try {
			QueryBuilder<AreaInfo, Integer> queryBuilder = areaDao.queryBuilder();
			queryBuilder.orderBy("code", false);
			return queryBuilder.query();
		} catch (SQLException e) {
			LLogger.e("创建数据类型时异常" + e);
		}
		return new ArrayList<AreaInfo>();
	}
	
	/**
	 * 初始化地区基础数据
	 * initArea(这里用一句话描述这个方法的作用)
	 * (这里描述这个方法适用条件 – 可选)
	 * void
	 * @exception
	 * @since  1.0.0
	 */
	public void initArea(Context context){
		if(isNeedInit()){
			syncData(AreaUtils.getCitiesFromAssets_1(context));
		}
	}
	
	/**
	 * 插入数据
	 * insert(这里用一句话描述这个方法的作用)
	 * (这里描述这个方法适用条件 – 可选)
	 * @param info
	 * void
	 * @exception
	 * @since  1.0.0
	 */
	public void insert(AreaInfo info){
		try {
			areaDao.create(info);
		} catch (SQLException e) {
			LLogger.e("创建数据类型时异常" + e);
		}
	}
	
	/**
	 * 是否需要初始化省市
	 * isNeedInit(这里用一句话描述这个方法的作用)
	 * (这里描述这个方法适用条件 – 可选)
	 * @return
	 * boolean
	 * @exception
	 * @since  1.0.0
	 */
	public boolean isNeedInit(){
		try {
			if(areaDao.isTableExists()){
				if(areaDao.queryForAll().size() == 0){
					return true;
				}
			}else{
				TableUtils.createTable(LDaoManager.connectionSource, AreaInfo.class);
				return true;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}
		return false;
	}
	
	/**
	 * 批量插入地区
	 * @param infos
	 */
	public void syncData(final List<AreaInfo> infos) {
		if(infos == null || infos.size() == 0)
			return;
		try {
			areaDao.callBatchTasks(new Callable<Void>() {

				@Override
				public Void call() throws Exception {
					areaDao.deleteBuilder().delete();
					for(AreaInfo info : infos) {
						areaDao.create(info);
					}
					return null;
				}});
		} catch (Exception e) {
			LLogger.e("保存数据类型时发生异常 ： " + e);
		}
	}
	

}
